package visiopuce.service.document;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Alteration;
import visiopuce.objets.Analyse;
import visiopuce.objets.CNVRecap;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Phenotype;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Puce;
import visiopuce.objets.RenduPuce;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.objets.VerifBiomol;
import visiopuce.objets.VerifFish;
import visiopuce.service.AlterationServiceImpl;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.ResultatServiceImpl;
import visiopuce.ui.CompteRenduDialog;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class CompteRenduPuce {

	public String createDocument(Puce puce, Resultat r) {
		String nomFichierout = "";
		try {

			boolean creer = true;
			InputStream in = new FileInputStream(new File(ApplicationContexte.REPERTOIRE_MODEL + "compteRenduPuce.docx"));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);
			Analyse analyse = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(r.getAnalyse().getIdAnalyse());
			Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(analyse.getPrelevement().getIdPrelevement());
			Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());
			RenduPuce rp = ResultatServiceImpl.getInstance().getRenduPuceByIdResultat(r.getIdResultat());
			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
			
			
			String repResultat = "";
			if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(1))) {
				repResultat = ApplicationContexte.REPERTOIRE_RESULTAT+"activité 20"+prelevement.getNumeroPrelevement().substring(1,3)+"\\"+prelevement.getNumeroPrelevement().substring(0,1)+"\\";
			} else {
				if (Character.isDigit(prelevement.getNumeroPrelevement().charAt(2))) {
					repResultat = ApplicationContexte.REPERTOIRE_RESULTAT+"activité 20"+prelevement.getNumeroPrelevement().substring(2,4)+"\\"+prelevement.getNumeroPrelevement().substring(0,2)+"\\";
				}	
			}
			
			
			
			CompteRenduDialog compteRenduDialog = new CompteRenduDialog(Display.getCurrent().getActiveShell(), puce.getIdPuce(), r.getIdResultat());
			if (compteRenduDialog.open() == IDialogConstants.CANCEL_ID) {
				return null;
			} else {

				// 2) Create Java model context
				IContext context = report.createContext();
				context.put("personne", personne);
				if (prelevement.getSecteur().getLibelle().equals("Puce postnatale") || prelevement.getSecteur().getLibelle().equals("Puce foetopathologie")) {
					context.put("dateNaissance", formatter.format(personne.getDateNaissance()));
					if (personne.getSexe().equals("M")) {
						context.put("sexe", "Sexe : Masculin");
					} else if (personne.getSexe().equals("F")) {
						context.put("sexe", "Sexe : Féminin");
					}
				} else {
					context.put("dateNaissance", formatter.format(personne.getDateNaissance()));
					Champ cSexeFoetus = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSexeFoetus", "Prel-" + prelevement.getIdPrelevement());
					Champ ctTerme = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tTerme", "Prel-" + prelevement.getIdPrelevement());
					String terme = "";
					if (ctTerme != null) {
						terme = "\tTerme : " + Integer.parseInt(ctTerme.getValeur());
					}
					if (cSexeFoetus != null) {
						if (cSexeFoetus.getValeur().equals("M")) {
							context.put("sexe", "Sexe du foetus : Masculin" + terme);
						} else if (cSexeFoetus.getValeur().equals("F")) {
							context.put("sexe", "Sexe du foetus :  Féminin" + terme);
						}
					} else {
						context.put("sexe", "Sexe du foetus :  à compléter" + terme);
					}
				}
				
				String indication = "";
				if (prelevement.getIndication() == null || prelevement.getIndication().getLibelle().equals("non renseigné")) {
					indication = "L'INDICATION N'A PAS ETE ENTREE";
				} else {
					if (!prelevement.getIndication().getLibelle().contains("utre")) {
						indication = prelevement.getIndication().getLibelle() + " - ";
					}
					Champ ctSigneAppel = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSigneAppel", "Prel-" + prelevement.getIdPrelevement());
					if (prelevement.getIndication().getLibelle().contains("ignes d'appel")) {
						if (ctSigneAppel != null) {
							indication = "Signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
						}
					} else {
						if (ctSigneAppel != null) {
							indication += "signes d'appel échographique : " + ctSigneAppel.getValeur() + " - ";
						}
					}
					if (personne.getPhenotype() != null) {
						indication += personne.getPhenotype() + " - ";
					}
					ArrayList<Phenotype> pheno = PersonneServiceImpl.getInstance().getPhenotypesByIdPersonne(personne.getIdPersonne());
					if (pheno != null) {
						for (Phenotype phenotype : pheno) {
							if (!indication.toLowerCase().contains(phenotype.getLibelle().toLowerCase())) {
								indication += phenotype.getLibelle() + " - ";
							}
						}
					}

				}

				context.put("indication", indication.substring(0,indication.length()-3)+".");
				Champ champCCL = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("conclCptRendu", "Res-" + r.getIdResultat());
				if (champCCL != null && champCCL.getValeur() != null) {
					context.put("conclCptRendu", champCCL.getValeur());
				}
				context.put("dateRendu", formatter.format(new Date()));

				if (prelevement.getDateReception() != null) {
					context.put("dateReception", formatter.format(prelevement.getDateReception()));
				}

				context.put("prelevement", prelevement);

				String cat = "";
				if (prelevement.getIndication() != null) {
					if (prelevement.getIndication().getCategorie() == 1) {
						cat = "Prénatal : " + prelevement.getIndication().getLibelle();
					} else if (prelevement.getIndication().getCategorie() == 2) {
						cat = "Postnatal : " + prelevement.getIndication().getLibelle();
					} else if (prelevement.getIndication().getCategorie() == 3) {
						cat = "Foetopathologie : " + prelevement.getIndication().getLibelle();
					} else if (prelevement.getIndication().getCategorie() == 4) {
						cat = "Prénatal avec IMG prévue : " + prelevement.getIndication().getLibelle();
					}
				} else {
					cat = personne.getPhenotype();
				}
				context.put("indication", cat);

				context.put("build", rp.getBuild());
				context.put("puce", puce);

				List<CNVRecap> cnvRecaps = new ArrayList<CNVRecap>();

				List<Alteration> alterations = AlterationServiceImpl.getInstance().getAlterationAVerif(puce.getIdPuce());
				for (Alteration alteration : alterations) {
					CNVRecap cnvR = new CNVRecap();

					Champ champGeneI = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("geneInteret", "Alt-" + alteration.getIdAlteration());
					if (champGeneI != null && champGeneI.getValeur() != null) {
						cnvR.setGenesInteret(champGeneI.getValeur());
					}
					Champ champCNVInt = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("cnvInteret", "Alt-" + alteration.getIdAlteration());
					if (champCNVInt != null && champCNVInt.getValeur() != null) {
						cnvR.setCnvInteret(champCNVInt.getValeur());
					}

					List<VerifFish> verifFishs = ResultatServiceImpl.getInstance().getVerifFishByIdAlteration(alteration.getIdAlteration());
					for (VerifFish verifFish : verifFishs) {

						Champ champconfirmeFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("confirmeFish", "Fish-" + verifFish.getIdVerifFish());
						if (champconfirmeFish != null && champconfirmeFish.getValeur() != null) {
							cnvR.setConfirmeFish(cnvR.getConfirmeFish() + champconfirmeFish.getValeur() + "\r\n");
						}
						Champ champtransmissionFish = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("transmissionFish", "Fish-" + verifFish.getIdVerifFish());
						if (champtransmissionFish != null && champtransmissionFish.getValeur() != null) {
							cnvR.setTransmissionFish(cnvR.getTransmissionFish() + champtransmissionFish.getValeur() + "\r\n");

						}
					}

					List<VerifBiomol> verifBiomols = ResultatServiceImpl.getInstance().getVerifBiomolByIdAlteration(alteration.getIdAlteration());
					for (VerifBiomol verifBiomol : verifBiomols) {

						Champ champconfirmeBiomol = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("confirmeBM", "BM-" + verifBiomol.getIdVerifBioMol());
						if (champconfirmeBiomol != null && champconfirmeBiomol.getValeur() != null) {
							cnvR.setConfirmeBM(cnvR.getConfirmeBM() + champconfirmeBiomol.getValeur() + "\r\n");
						}
						Champ champtransmissionBiomol = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("transmissionBM", "BM-" + verifBiomol.getIdVerifBioMol());
						if (champtransmissionBiomol != null && champtransmissionBiomol.getValeur() != null) {
							cnvR.setTransmissionBM(cnvR.getTransmissionBM() + champtransmissionBiomol.getValeur() + "\r\n");

						}
					}

					cnvRecaps.add(cnvR);
				}

				context.put("cnvRecaps", cnvRecaps);

				Champ champccl = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("conclCptRendu", "Res-" + r.getIdResultat());
				if (champccl != null) {
					context.put("conclusion", champccl.getValeur());
				}

				if (prelevement.getPrescripteur() != null) {
					context.put("prescripteur", prelevement.getPrescripteur());
					File fileout = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_cr" + r.getAnalyse().getIdAnalyse() + "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
							+ prelevement.getPrescripteur().getNom() + ".docx");
					if (fileout.exists()) {
						creer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout.getName() + " existe déjà souhaitez vous l'écraser?");
					}
					if (creer) {
						fileout.setWritable(true);
						OutputStream out = new FileOutputStream(fileout);
						report.process(context, out);
						if (fileout.exists()) {
							nomFichierout += fileout.getName() + "#";
						}
						out.close();
					}
				}
				if (prelevement.getPrescripteur2() != null) {
					context.put("prescripteur", prelevement.getPrescripteur2());
					boolean creer2 = true;
					File fileout2 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_cr" + r.getAnalyse().getIdAnalyse() + "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
							+ prelevement.getPrescripteur2().getNom() + ".docx");
					if (fileout2.exists()) {
						creer2 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout2.getName() + " existe déjà souhaitez vous l'écraser?");
					}
					if (creer2) {
						fileout2.setWritable(true);
						OutputStream out2 = new FileOutputStream(fileout2);
						report.process(context, out2);
						if (fileout2.exists()) {
							nomFichierout += fileout2.getName() + "#";
						}
						out2.close();
					}
				}

				if (prelevement.getPrescripteur3() != null) {
					context.put("prescripteur", prelevement.getPrescripteur3());
					boolean creer3 = true;
					File fileout3 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_cr" + r.getAnalyse().getIdAnalyse() + "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
							+ prelevement.getPrescripteur3().getNom() + ".docx");
					if (fileout3.exists()) {
						creer3 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout3.getName() + " existe déjà souhaitez vous l'écraser?");
					}
					if (creer3) {
						fileout3.setWritable(true);
						OutputStream out3 = new FileOutputStream(fileout3);
						report.process(context, out3);
						if (fileout3.exists()) {
							nomFichierout += fileout3.getName() + "#";
						}
						out3.close();
					}
				}

				if (prelevement.getNomPrenomAutrePresc() != null && !prelevement.getNomPrenomAutrePresc().isEmpty()) {
					boolean creer4 = true;
					File fileout4 = new File(repResultat + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_cr" + r.getAnalyse().getIdAnalyse() + "_resultat" + r.getIdResultat() + "_" + formatter.format(new Date()) + "_"
							+ prelevement.getNomPrenomAutrePresc() + ".docx");
					if (fileout4.exists()) {
						creer4 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout4.getName() + " existe déjà souhaitez vous l'écraser?");
					}
					if (creer4) {
						Utilisateur prescAutre = new Utilisateur();
						prescAutre.setNom(prelevement.getNomPrenomAutrePresc());
						prescAutre.setPrenom("");
						prescAutre.setAdresse("A compléter");
						context.put("prescripteur", prescAutre);
						fileout4.setWritable(true);
						OutputStream out4 = new FileOutputStream(fileout4);
						report.process(context, out4);
						if (fileout4.exists()) {
							nomFichierout += fileout4.getName() + "#";
						}
						out4.close();
					}
				}
			}
			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XDocReportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nomFichierout;
	}
}
